package ru.kreda.webapp.client;

import ru.kreda.webapp.client.ui.BlockUIDialog;

/**
 * Callback, который в период [создание объекта .. возврат результата]
 * показывает пользователю заставку, блокируя другие действия.
 */
public abstract class BlockAsyncCallback<T> extends AsyncCallbackBase<T> {
	private BlockUIDialog uiDialog;

	/**
	 * Конструктор.
	 * 
	 * @param message
	 *            сообщение пользователю
	 */
	public BlockAsyncCallback(String message) {
		uiDialog = new BlockUIDialog(message);
		uiDialog.show();
	}

	/**
	 * Конструктор.
	 */
	public BlockAsyncCallback() {
		this(BlockUIDialog.DEFAULT_MESSAGE);
	}

	@Override
	public final void onSuccess(T result) {
		try {
			handleResult(result);
			hideWait();
		} catch (Throwable caught) {
			onFailure(caught);
		}
	}

	@Override
	public final void onFailure(Throwable caught) {
		hideWait();
		super.onFailure(caught);
	}

	private void hideWait() {
		uiDialog.hide();
	}

	/**
	 * Вызывается для обработки результата.
	 * 
	 * @param result
	 *            результат
	 */
	protected abstract void handleResult(T result);

}
